//
//  CATextLayerViewController.m
//  CoreAnimation
//
//  Created by 张国文 on 16/10/13.
//  Copyright © 2016年 hangzhouyijiyin. All rights reserved.
//

#import "CATextLayerViewController.h"
#import <CoreText/CoreText.h>

@interface CATextLayerViewController ()

@property (nonatomic, strong) UIView *backgroundView;

@end

@implementation CATextLayerViewController

/**
 *  前言：
 如果你想在一个图层里面显示文字，完全可以借助图层代理直接将字符串使用Core Graphics写入图层的内容（这就是UILabel的精髓）。如果越过寄宿于图层的视图，直接在图层上操作，那其实相当繁琐。你要为每一个显示文字的图层创建一个能像图层代理一样工作的类，还要逻辑上判断哪个图层需要显示哪个字符串，更别提还要记录不同的字体，颜色等一系列乱七八糟的东西。
 
 万幸的是这些都是不必要的，Core Animation提供了一个CALayer的子类CATextLayer，它以图层的形式包含了UILabel几乎所有的绘制特性，并且额外提供了一些新的特性。
 
⚠️ 同样，CATextLayer也要比UILabel渲染得快得多。很少有人知道在iOS 6及之前的版本，UILabel其实是通过WebKit来实现绘制的，这样就造成了当有很多文字的时候就会有极大的性能压力。而CATextLayer使用了Core text，并且渲染得非常快。
 ⚠️：也就是说用CALayer中特定图层，比让UIView执行drawRect渲染的更快，因为CALayer的特定图层绘制内容有硬件加速。
 */

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    self.view.backgroundColor = [UIColor whiteColor];
    
    self.backgroundView = [[UIView alloc] initWithFrame:self.view.frame];
    self.backgroundView.backgroundColor = [[UIColor grayColor] colorWithAlphaComponent:0.5];
    [self.view addSubview:_backgroundView];
    
    UIButton *button1 = [UIButton buttonWithType:UIButtonTypeCustom];
    button1.frame = CGRectMake(0, 450, 375, 30);
    [button1 setTitle:@"CATextLayer的string使用NSString" forState:UIControlStateNormal];
    [button1 setTitleColor:[UIColor redColor] forState:UIControlStateNormal];
    [button1 addTarget:self action:@selector(CATextLayer:) forControlEvents:UIControlEventTouchUpInside];
    button1.tag = 200;
    [self.view addSubview:button1];
    
    UIButton *button2 = [UIButton buttonWithType:UIButtonTypeCustom];
    button2.frame = CGRectMake(0, 480, 375, 60);
    [button2 setTitle:@"CATextLayer的string使用NSMutableAttributedString" forState:UIControlStateNormal];
    button2.titleLabel.numberOfLines = 0;
    [button2 setTitleColor:[UIColor redColor] forState:UIControlStateNormal];
    [button2 addTarget:self action:@selector(CATextLayer:) forControlEvents:UIControlEventTouchUpInside];
    button2.tag = 201;
    [self.view addSubview:button2];
}

- (void)CATextLayer:(UIButton *)button
{
    for (int i = 0; i < self.backgroundView.layer.sublayers.count; i++) {
        if ([self.backgroundView.layer.sublayers[i] isKindOfClass:[CATextLayer class]]) {
            [self.backgroundView.layer.sublayers[i] removeFromSuperlayer];
        }
    }
    switch (button.tag) {
        case 200:
        {
            [self userNSStringToCATextLayer];
            break;
        }
            case 201:
        {
            [self userNSMutableAttributedStringToCATextLayer];
            break;
        }
        default:
            break;
    }
}


- (void)userNSStringToCATextLayer
{
    // 使用NSString为CATextLayer设置字体的话，字体的的类型需要运用到CGFontRef
    CATextLayer *textLayer = [CATextLayer layer];
    textLayer.frame = CGRectMake(70, 50, 200, 200);
    textLayer.backgroundColor = [[UIColor cyanColor] colorWithAlphaComponent:0.2].CGColor; // 背景颜色
    textLayer.foregroundColor = [UIColor redColor].CGColor; // 字体颜色
    textLayer.alignmentMode = kCAAlignmentCenter; // 居中对齐
    textLayer.contentsScale = [UIScreen mainScreen].scale; // 使用Retina渲染
    textLayer.wrapped = YES; // 是否换行，warp的英文意思隐藏、包。 textLayer没有numberOfLines属性，这个属性相当于允许是否换行，YES允许换行(其实就是允许显示隐藏的内容了)，NO不允许换行(即字体在一行显示)，默认值为NO
    
    // 下面将要设置CATextLayer的字体大小，用到了CGFontRef
    UIFont *font = [UIFont fontWithName:@"Arial-BoldMT" size:20]; // 这里我设置一个加粗的字体来区分清除
    CFStringRef fontName = (__bridge CFStringRef)(font.fontName);
    CGFontRef fontRef = CGFontCreateWithFontName(fontName); // 到这里将fontName转化为CGFontRef类型
    textLayer.font = fontRef;
    textLayer.fontSize = font.pointSize;
    NSString *text = @"遥远的东方有一条龙，它的名字就叫中国；遥远的东方有一条河，它的名字就叫长江";
    textLayer.string = text;
    [self.backgroundView.layer addSublayer:textLayer];
    
}

- (void)userNSMutableAttributedStringToCATextLayer
{
    // 使用NSMutableAttributedString为CATextLayer设置字体的话，字体的类型需要用到CTFontRef
    CATextLayer *textLayer = [CATextLayer layer];
    textLayer.frame = CGRectMake(70, 50, 200, 200);
    textLayer.backgroundColor = [[UIColor cyanColor] colorWithAlphaComponent:0.2].CGColor; // 背景颜色
    textLayer.foregroundColor = [UIColor redColor].CGColor; // 字体颜色，如果使用NSMutableAttributedString这样设置字体就没有用了
    textLayer.alignmentMode = kCAAlignmentCenter; // 居中对齐
    textLayer.contentsScale = [UIScreen mainScreen].scale; // 使用Retina渲染
    textLayer.wrapped = YES; // 是否换行，warp的英文意思隐藏、包。 textLayer没有numberOfLines属性，这个属性相当于允许是否换行，YES允许换行(其实就是允许显示隐藏的内容了)，NO不允许换行(即字体在一行显示)，默认值为NO
    
    // 下面用到了CTFontRef，运用CTFontRef需要引入<CoreText/CoreText.h>
    UIFont *font = [UIFont fontWithName:@"Arial-BoldMT" size:20];
    CFStringRef fontName = (__bridge CFStringRef)(font.fontName);
    CTFontRef fontRef = CTFontCreateWithName(fontName, font.pointSize, NULL);
    
    NSString *text = @"遥远的东方有一条龙，它的名字就叫中国；遥远的东方有一条河，它的名字就叫长江";
    NSMutableAttributedString *attrString = [[NSMutableAttributedString alloc] initWithString:text];
    // 我们先设置一下整体的字体颜色
    [attrString addAttributes:@{(__bridge id)kCTForegroundColorAttributeName:(__bridge id)[UIColor blueColor].CGColor, (__bridge id)kCTFontAttributeName:(__bridge id)fontRef} range:NSMakeRange(0, text.length)]; // 意思是设置字体的颜色为红色，字体的类型为fontRef
  //   [attrString addAttributes:@{(__bridge id)kCTFontAttributeName:(__bridge id)fontRef} range:NSMakeRange(0, text.length)]; // 如果不设置颜色的话颜色默认为黑色
    // 我们为部分字体设置颜色并且可以设置下划线,这里我们将“一条龙”设置具体的颜色和下划线
    [attrString addAttributes:@{(__bridge id)kCTForegroundColorAttributeName:(__bridge id)[UIColor redColor].CGColor, (__bridge id)kCTFontAttributeName: (__bridge id)fontRef, (__bridge id)kCTUnderlineStyleAttributeName:@(kCTUnderlineStyleDouble), (__bridge id)kCTUnderlineColorAttributeName:(__bridge id)[UIColor yellowColor].CGColor} range:NSMakeRange(6, 3)]; // 为“一条龙”设置红色，双下滑线，下划线颜色黄色
    
    
    textLayer.string = attrString;
    [self.backgroundView.layer addSublayer:textLayer];
   
    
}

@end
